package manager

import (
	"BlazeRider-backend/app/db"
	"database/sql"
	"fmt"
	"log"
	"sync"
	"time"
)

// DYTokenMysqlStorage 管理礼物赠送记录
type DYTokenMysqlInfo struct {
	DyTokenId string       `db:"dy_token_id"`
	Token     string       `db:"token"`
	ExpireAt  time.Time    `db:"expire_at"`
	CreateAt  sql.NullTime `db:"create_at"` // 使用 NullTime
	UpdateAt  sql.NullTime `db:"update_at"` // 使用 NullTime
}

type DYTokenMysqlStorage struct {
	dYTokenRecords map[string]map[string][]DYTokenMysqlInfo
	db             *sql.DB
	mu             sync.Mutex
}

func NewDYTokenMysqlStorage() (*DYTokenMysqlStorage, error) {
	return &DYTokenMysqlStorage{
		dYTokenRecords: make(map[string]map[string][]DYTokenMysqlInfo),
	}, nil
}

// AddGiftRecord 增加礼物赠送记录
func (dytms *DYTokenMysqlStorage) AddToken(token string) error {
	_, err := db.GetDB().Exec(`
		INSERT INTO dy_token 
			(token, expire_at, create_at, update_at)
		VALUES 
			(?, DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 60 Minute), CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
	`,
		token) // 更新值参数

	if err != nil {
		fmt.Println("create douyin token error : ", err)
		return fmt.Errorf("create douyin token error : %v", err)
	}
	return nil
}

// 查询本局最后一次该礼物信息
func (dytms *DYTokenMysqlStorage) GetLastCanUseToken() (*DYTokenMysqlInfo, error) {
	// 定义一个变量来存储查询结果
	var dYTokenInfo DYTokenMysqlInfo

	// 执行 SQL 查询
	err := db.GetDB().QueryRow(`
        SELECT dy_token_id, token, expire_at, create_at, update_at
        FROM dy_token
        WHERE expire_at >= now()
		ORDER BY expire_at DESC
		Limit 1
    `).Scan(
		&dYTokenInfo.DyTokenId,
		&dYTokenInfo.Token,
		&dYTokenInfo.ExpireAt,
		&dYTokenInfo.CreateAt,
		&dYTokenInfo.UpdateAt,
	)

	// 处理错误
	if err != nil {
		log.Printf("No token found ") // 打印其他错误信息
		return nil, err               // 返回其他错误
	}

	// 查询成功，返回结果
	return &dYTokenInfo, nil
}

func (dytms *DYTokenMysqlStorage) ExpireCanUseToken() error {
	_, err := db.GetDB().Exec(`
		UPDATE dy_token
			SET expire_at = DATE_SUB(NOW(), INTERVAL 1 SECOND)
			WHERE expire_at > NOW();
	`,
	) // 更新值参数

	if err != nil {
		return fmt.Errorf("expire can use Token error: %v", err)
	}
	return nil
}
